import axios from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useUserStore } from '@/stores'
import router from '@/router'
import { normalizeResponse, normalizeAxiosError } from '@/utils/http-normalize'

// 获取 baseURL，按优先级读取
function getBaseURL() {
  // A. 优先使用运行时配置
  if (window.__APP_CONFIG__?.API_BASE) {
    return window.__APP_CONFIG__.API_BASE
  }
  
  // B. 使用环境变量
  if (import.meta.env.VITE_API_BASE) {
    return import.meta.env.VITE_API_BASE
  }
  
  // C. 兜底配置
  if (import.meta.env.DEV) {
    return '/api' // 开发环境使用代理
  } else {
    return 'http://114.67.64.10' // 生产环境默认地址
  }
}

// 创建统一的 axios 实例
const httpClient = axios.create({
  baseURL: getBaseURL(),
  timeout: 60000
})

// 是否显示重新登录的确认提示框
const relogin = {
  show: false
}

// 添加请求拦截器
httpClient.interceptors.request.use(
  (config) => {
    const userStore = useUserStore()
    const { token } = userStore
    if (token) {
      config.headers.Authorization = token
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// 添加响应拦截器
httpClient.interceptors.response.use(
  (response) => {
    try {
      return normalizeResponse(response)
    } catch (error) {
      // 业务错误显示提示
      ElMessage.error(error.message)
      return Promise.reject(error)
    }
  },
  async (error) => {
    const normalizedError = normalizeAxiosError(error)
    const { response } = error
    
    // 401未授权处理
    if (response && response.status === 401) {
      if (relogin.show) return Promise.reject(normalizedError)
      relogin.show = true
      try {
        await ElMessageBox.confirm(
          '登录状态已过期,您可以继续留在当前页或重新登录',
          '系统提示',
          {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
          }
        )
        const userStore = useUserStore()
        userStore.logoutAction()
        router.push(
          `/login?redirectUrl=${router.currentRoute.value.path}`
        )
        return Promise.reject(new Error('token过期'))
      } catch (e) {
        return Promise.reject(normalizedError)
      } finally {
        relogin.show = false
      }
    } else {
      // 其他错误显示提示
      ElMessage.error(normalizedError.message)
      return Promise.reject(normalizedError)
    }
  }
)

// 导出统一的请求函数
export default ({ url, method, data, params, header }) => {
  return httpClient({
    url,
    method,
    data,
    params,
    headers: header
  })
}

// 导出 axios 实例供直接使用
export { httpClient }

